#include<iostream>
#include<vector>
#include<string>
#include<unistd.h>
#include<pthread.h>
#include"LockGuard.hpp"

using namespace std;

#define NUM 4
int tickets=3000;
pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;

class PtData
{
public:
    PtData(int number)
    {
        _ptname="thread-"+to_string(number);
    }

public:
    string _ptname;
};

void* GetTicket(void* args)//模拟一轮抢票
{
    PtData* td=static_cast<PtData*>(args);
    const char* name=td->_ptname.c_str();
    while(true)
    {
        {
        //加锁
        LockGuard lockguard(&lock);//临时的LockGuard对象，限定在这个花括号里，RAII风格
        if(tickets>0)
        {
            usleep(1000);
            printf("who=%s,get a ticket:%d \n",name,tickets);
            tickets--;
        }
        else break;
        }
        usleep(15);//模拟抢票的后续动作
    }
    printf("%s....quit\n",name);
    return nullptr;
}

// void* GetTicket(void* args)//模拟一轮抢票
// {
//     PtData* td=static_cast<PtData*>(args);
//     const char* name=td->_ptname.c_str();
//     pthread_mutex_t* lock=td->_lock;
//     while(true)
//     {
//         //加锁
//         pthread_mutex_lock(lock);
//         if(tickets>0)
//         {
//             usleep(1000);
//             printf("who=%s,get a ticket:%d \n",name,tickets);
//             tickets--;
//             pthread_mutex_unlock(lock);//访问完临界资源要解锁
//         }
//         else 
//         {
//             pthread_mutex_unlock(lock);//访问完临界资源要解锁
//             break;
//         }
//         usleep(15);//模拟抢票的后续动作
//     }
//     printf("%s....quit\n",name);
//     return nullptr;
// }

int main()
{
    //创建多线程
    vector<pthread_t> tids;
    vector<PtData*> pds;
    //初始化锁
    // pthread_mutex_t lock;
    // pthread_mutex_init(&lock,nullptr);
    for(int i=1;i<=NUM;i++)
    {
        pthread_t tid;
        PtData* td=new PtData(i);//让不同的线程看到同一把锁，都传同一把锁
        pds.push_back(td);
        pthread_create(&tid,nullptr,GetTicket,td);
        tids.push_back(tid);
    }

    for(auto tid:tids)
    {
        pthread_join(tid,nullptr);
    }
    for(auto pd:pds)
    {
        delete pd;
    }
    //锁的销毁
    // pthread_mutex_destroy(&lock);
    return 0;
}